#include "NetworkManager.h"
#include <QDebug>
#include <cstring>
#include <cstdlib>
//#include <winsock2.h>

NetworkManager::NetworkManager(QObject *parent) : QObject(parent),
    m_tcpSocket(new QTcpSocket(this))
{
    // 连接网络信号槽
    connect(m_tcpSocket, &QTcpSocket::readyRead, this, &NetworkManager::onReadyRead);
    connect(m_tcpSocket, &QTcpSocket::connected, this, &NetworkManager::connected);
    connect(m_tcpSocket, &QTcpSocket::disconnected, this, &NetworkManager::disconnected);
    connect(m_tcpSocket, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error),
            this, &NetworkManager::onSocketError);
}

//void sendMessage(const QString& data)
//{
//    if (!m_isConnected) {
//          emit errorOccurred("未连接到服务器，无法发送消息");
//          return;
//      }

//      // 直接发送字符串（附加换行符作为结束标识）
//      QByteArray sendData = data.toUtf8() + "\n";
//      m_socket->write(sendData);

//      // 调试信息
//      qDebug() << "发送消息:" << data;
//}
// 新增：发送字符串（附加换行符作为结束标识）
void NetworkManager::sendString(const QString& data)
{
    if (m_tcpSocket->state() != QTcpSocket::ConnectedState) {
        emit errorOccurred("未连接到服务器，无法发送字符串");
        return;
    }

    // 发送字符串（附加换行符方便服务器分割消息）
    QByteArray sendData = data.toUtf8();
    qDebug()<<"sendData :"<<sendData<<endl;
    m_tcpSocket->write(sendData);
    m_tcpSocket->flush();  // 立即发送

    qDebug() << "发送字符串：" << data;
}
void NetworkManager::connectToServer(const QString &ip, quint16 port)
{
    if (m_tcpSocket->state() == QTcpSocket::ConnectedState) {
        m_tcpSocket->disconnectFromHost();
    }
    m_tcpSocket->connectToHost("192.168.5.185", port);
    qDebug() << "Qt客户端尝试连接：" << ip << ":" << port;  // 必须添加！

}

void NetworkManager::sendTlvPacket(const wd::TLV &tlv)
{
    if (m_tcpSocket->state() != QTcpSocket::ConnectedState) {
        emit errorOccurred("未连接到服务器");
        return;
    }


    QByteArray data;

    // 添加type字段（4字节，网络字节序）
//    int raw_type = htonl(tlv.type);
    int raw_type = tlv.type;
    data.append(reinterpret_cast<const char*>(&raw_type), sizeof(raw_type));

    // 添加length字段（4字节，网络字节序）
//     int raw_length = htonl(tlv.length);
    int raw_length = tlv.length;
    data.append(reinterpret_cast<const char*>(&raw_length), sizeof(raw_length));

    // 添加data字段
    data.append(tlv.data, tlv.length);

    // 添加换行符作为包结束标志
    data.append('\n');

    // 发送数据并刷新缓冲区
    m_tcpSocket->write(data);
    m_tcpSocket->flush();

    // 调试信息
    qDebug() << "发送TLV：type=" << tlv.type
             << ", length=" << tlv.length
             << ", data=" << QString(tlv.data);
}

bool NetworkManager::isConnected() const

{

    qDebug()<<"现在状态是:"<<endl;
    return m_tcpSocket->state() == QTcpSocket::ConnectedState;
}

void NetworkManager::onReadyRead()
{
    QByteArray data = m_tcpSocket->readAll();

    qDebug() << "收到原始数据（字节数）：" << data.size() << "，内容：" << data.toHex();
    // 移除末尾的换行符
    if (data.endsWith('\n')) {
        data.chop(1);
    }

    wd::TLV respTlv;
    // 检查数据长度是否至少包含type和length字段
    if (data.size() < sizeof(int) + sizeof(int)) {
        emit errorOccurred("接收数据格式不正确");
        return;
    }

    int offset = 0;
    int raw_type, raw_length;

    // 解析type字段（网络字节序→主机字节序）
    memcpy(&raw_type, data.data() + offset, sizeof(raw_type));
//  respTlv.type = ntohl(raw_type);
   respTlv.type=raw_type;
    offset += sizeof(raw_type);

    // 解析length字段（网络字节序→主机字节序）
    memcpy(&raw_length, data.data() + offset, sizeof(raw_length));
//    respTlv.length = ntohl(raw_length);
     respTlv.length = raw_length;
    offset += sizeof(raw_length);

    // 验证数据长度的合法性
    if (respTlv.length < 0 || respTlv.length > 1024 || (offset + respTlv.length) > data.size()) {
        emit errorOccurred("接收数据长度无效");
        return;
    }

    // 解析data字段
    memcpy(respTlv.data, data.data() + offset, respTlv.length);

    // 发送解析后的TLV数据
    emit tlvReceived(respTlv);
}

void NetworkManager::onSocketError(QAbstractSocket::SocketError error)
{
    Q_UNUSED(error);
    emit errorOccurred(m_tcpSocket->errorString());
}
